#!/usr/bin/env python3
"""
面向 asciidoctor 文档转换工具的 MCP Server

MCP tools 列表：
1. asciidoctor_basic_operations - 执行 asciidoctor 基础操作
   参数: input_file (str), options (dict) - 包含各种基础选项
   返回: 统一的命令执行结果 JSON

2. asciidoctor_advanced_operations - 执行 asciidoctor 高级操作
   参数: input_file (str), options (dict) - 包含各种高级选项
   返回: 统一的命令执行结果 JSON

3. asciidoctor_output_operations - 执行 asciidoctor 输出相关操作
   参数: input_file (str), options (dict) - 包含输出相关选项
   返回: 统一的命令执行结果 JSON
"""

from mcp.server.fastmcp import FastMCP, Context
import subprocess
import json
from typing import Dict, Any

mcp = FastMCP("Asciidoctor MCP Server")

@mcp.tool()
def asciidoctor_basic_operations(input_file: str, options: Dict[str, Any] = None) -> Dict[str, Any]:
    """
    执行 asciidoctor 基础命令行操作
    
    参数:
        input_file: 输入的 asciidoc 文件路径
        options: 选项字典，支持以下键值：
            - help: bool - 显示帮助信息 (-h)
            - version: bool - 显示版本信息 (-V)
            - backend: str - 设置后端格式 (-b)
            - doctype: str - 设置文档类型 (-d)
            - no_output: bool - 不生成输出文件 (-e)
            - output: str - 指定输出文件 (-o)
            - source_dir: str - 设置源目录 (-R)
            - safe_mode: str - 设置安全模式 (-S)
            - no_header_footer: bool - 不包含页眉页脚 (-s)
            - section_numbers: bool - 添加节编号 (-n)
    
    返回:
        {
            "success": bool - 命令是否成功执行,
            "command": str - 实际执行的命令,
            "exit_code": int - 命令退出码,
            "stdout": str - 标准输出,
            "stderr": str - 标准错误
        }
    """
    if options is None:
        options = {}
    
    cmd_parts = ["asciidoctor"]
    
    # 处理基础选项
    if options.get("help"):
        cmd_parts.append("-h")
    elif options.get("version"):
        cmd_parts.append("-V")
    else:
        if options.get("backend"):
            cmd_parts.extend(["-b", options["backend"]])
        if options.get("doctype"):
            cmd_parts.extend(["-d", options["doctype"]])
        if options.get("no_output"):
            cmd_parts.append("-e")
        if options.get("output"):
            cmd_parts.extend(["-o", options["output"]])
        if options.get("source_dir"):
            cmd_parts.extend(["-R", options["source_dir"]])
        if options.get("safe_mode"):
            cmd_parts.extend(["-S", options["safe_mode"]])
        if options.get("no_header_footer"):
            cmd_parts.append("-s")
        if options.get("section_numbers"):
            cmd_parts.append("-n")
        
        cmd_parts.append(input_file)
    
    command = " ".join(cmd_parts)
    
    try:
        result = subprocess.run(cmd_parts, capture_output=True, text=True, timeout=30)
        return {
            "success": result.returncode == 0,
            "command": command,
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except Exception as e:
        return {
            "success": False,
            "command": command,
            "exit_code": -1,
            "stdout": "",
            "stderr": str(e)
        }

@mcp.tool()
def asciidoctor_advanced_operations(input_file: str, options: Dict[str, Any] = None) -> Dict[str, Any]:
    """
    执行 asciidoctor 高级命令行操作
    
    参数:
        input_file: 输入的 asciidoc 文件路径
        options: 选项字典，支持以下键值：
            - template_dir: str - 设置模板目录 (-T)
            - template_engine: str - 设置模板引擎 (-E)
            - include_path: str - 添加包含路径 (-I)
            - destination_dir: str - 设置目标目录 (-D)
            - require_lib: str - 加载 Ruby 库 (-r)
            - failure_level: str - 设置失败级别 (--failure-level)
            - quiet: bool - 安静模式 (-q)
            - attribute: str - 设置文档属性 (-a)
    
    返回:
        {
            "success": bool - 命令是否成功执行,
            "command": str - 实际执行的命令,
            "exit_code": int - 命令退出码,
            "stdout": str - 标准输出,
            "stderr": str - 标准错误
        }
    """
    if options is None:
        options = {}
    
    cmd_parts = ["asciidoctor"]
    
    # 处理高级选项
    if options.get("template_dir"):
        cmd_parts.extend(["-T", options["template_dir"]])
    if options.get("template_engine"):
        cmd_parts.extend(["-E", options["template_engine"]])
    if options.get("include_path"):
        cmd_parts.extend(["-I", options["include_path"]])
    if options.get("destination_dir"):
        cmd_parts.extend(["-D", options["destination_dir"]])
    if options.get("require_lib"):
        cmd_parts.extend(["-r", options["require_lib"]])
    if options.get("failure_level"):
        cmd_parts.extend(["--failure-level", options["failure_level"]])
    if options.get("quiet"):
        cmd_parts.append("-q")
    if options.get("attribute"):
        cmd_parts.extend(["-a", options["attribute"]])
    
    cmd_parts.append(input_file)
    command = " ".join(cmd_parts)
    
    try:
        result = subprocess.run(cmd_parts, capture_output=True, text=True, timeout=30)
        return {
            "success": result.returncode == 0,
            "command": command,
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except Exception as e:
        return {
            "success": False,
            "command": command,
            "exit_code": -1,
            "stdout": "",
            "stderr": str(e)
        }

@mcp.tool()
def asciidoctor_output_operations(input_file: str, options: Dict[str, Any] = None) -> Dict[str, Any]:
    """
    执行 asciidoctor 输出相关命令行操作
    
    参数:
        input_file: 输入的 asciidoc 文件路径
        options: 选项字典，支持以下键值：
            - warnings: bool - 启用警告 (-w)
            - to_stdout: bool - 输出到标准输出 (-t)
            - verbose: bool - 详细模式 (-v)
    
    返回:
        {
            "success": bool - 命令是否成功执行,
            "command": str - 实际执行的命令,
            "exit_code": int - 命令退出码,
            "stdout": str - 标准输出,
            "stderr": str - 标准错误
        }
    """
    if options is None:
        options = {}
    
    cmd_parts = ["asciidoctor"]
    
    # 处理输出相关选项
    if options.get("warnings"):
        cmd_parts.append("-w")
    if options.get("to_stdout"):
        cmd_parts.append("-t")
    if options.get("verbose"):
        cmd_parts.append("-v")
    
    if not options.get("to_stdout"):
        cmd_parts.append(input_file)
    
    command = " ".join(cmd_parts)
    
    try:
        result = subprocess.run(cmd_parts, capture_output=True, text=True, timeout=30)
        return {
            "success": result.returncode == 0,
            "command": command,
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except Exception as e:
        return {
            "success": False,
            "command": command,
            "exit_code": -1,
            "stdout": "",
            "stderr": str(e)
        }

if __name__ == "__main__":
    mcp.run()